package com.aqie.demo.Face;

import com.aqie.demo.HIKNetSDK.FMSGCallBack_V31;
import com.aqie.demo.HIKNetSDK.HCNetSDK;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * @author jiangxin
 * @create 2021-04-13-10:31
 * 报警布防/监听功能模块：功能：报警布防/监听实时接受设备的人脸比对报警事件，回调函数中获取的报警类型(lCommand)为COMM_SNAP_MATCH_ALARM，报警信息(pAlarmInfo)对应结构体：NET_VCA_FACESNAP_MATCH_ALARM。
 * fSimilarity相似度大于0表示人脸比对成功，可以获取人脸库相关数据；fSimilarity相似度为0，需要通过NET_VCA_BLACKLIST_INFO结构体里面的byType类型判断，值为1表示陌生人模式，值为2表示人脸比对失败。
 */
@Slf4j
public class Alarm {

    // 用户id，布防句柄
    public static Map<Integer, Integer> map = new HashMap<Integer,Integer>(10);

    /**
     * 超脑对应宿舍楼编号
     */
    public static Map<String, String> snMap = new HashMap<String, String>() {
        {
            put("iDS-9608NX-I8 / X0820200706CCRRE57545482WCVU", "A1"); // 一号楼 192.168.100.202
            put("iDS-9608NX-I8/X0820200730CCRRE65086465WCVU", "A2"); // 二号男生宿舍楼 192.168.100.203
            put("iDS-9608NX-I8/X0820200730CCRRE65086489WCVU", "A3"); // 三号男生宿舍楼 192.168.100.200
            put("iDS-9608NX-I8/X0820200730CCRRE65086495WCVU", "A4"); // 四号公寓      192.168.100.204
            put("iDS-9608NX-I8/X0820200730CCRRE65086487WCVU", "A5"); // 五号女生公寓   192.168.100.205
            put("iDS-9608NX-I8/X0820200730CCRRE65086463WCVU", "A6"); // 6号公寓      192.168.100.206
        }
    };

    /**
     * 超脑 ip 对应
     */
    public static Map<String, String> serverIpMap = new HashMap<String, String>(6) {
        {
            put("192.168.100.202", "A1");
            put("192.168.100.203", "A2");
            put("192.168.100.200", "A3");
            put("192.168.100.204", "A4");
            put("192.168.100.205", "A5");
            put("192.168.100.206", "A6");
        }
    };


    /**
     * 摄像头对应进出
     */
    public static Map<String, Byte> clientIpMap = new HashMap<String, Byte>(24) {
        {
            // A1 一号 192.168.100.202
            put("192.168.100.193", (byte)1); // out n
            put("192.168.100.191", (byte)0); // y
            put("192.168.100.192", (byte)0); // y
            put("192.168.100.190", (byte)0); // y

            // A2 二号 192.168.100.203
            put("192.168.100.194", (byte)0); // y
            put("192.168.100.176", (byte)0); // n
            put("192.168.100.174", (byte)1);
            put("192.168.100.175", (byte)0);

            // A3 三号 192.168.100.200
            put("192.168.100.171", (byte)0); // y
            put("192.168.100.170", (byte)1);
            put("192.168.100.173", (byte)0); // y
            put("192.168.100.172", (byte)0); // y

            // A4 四号 192.168.100.204
            put("192.168.100.181", (byte)0); // y
            put("192.168.100.180", (byte)0); // y
            put("192.168.100.178", (byte)1);
            put("192.168.100.179", (byte)0); // y
            // A5 五号 192.168.100.205
            put("192.168.100.182", (byte)1);  // y
            put("192.168.100.183", (byte)0); // y
            put("192.168.100.185", (byte)0); // y
            put("192.168.100.184", (byte)0); // y
            // A6 6号 192.168.100.206
            put("192.168.100.186", (byte)0); // y
            put("192.168.100.187", (byte)1); // y
            put("192.168.100.188", (byte)0); // y
            put("192.168.100.189", (byte)0); // y

        }
    };

    public int lListenHandle = -1; //监听句柄
    public static FMSGCallBack_V31 fMSFCallBack_V31 = null;

    private static final Alarm alarm = new Alarm();

    private Alarm() {
    }

    public static Alarm getAlarmInstance(){
        return alarm;
    }

    /**
     * 报警布防 （布防和监听选其一）
     *
     * @param lUserID 用户登录句柄
     */
    public void SetAlarm(int lUserID) {
        //尚未布防,需要布防
        int lAlarmHandle = -1; //布防句柄

        map.put(lUserID, -1);
        // log.info("1. 是否需要布防 lAlarmHandle" + " " + lUserID + " " + map.get(lUserID));
        if (map.get(lUserID) < 0) {
            if (fMSFCallBack_V31 == null) {
                fMSFCallBack_V31 = new FMSGCallBack_V31();
                Pointer pUser = null;
                if (!FaceMain.hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) {
                    log.info("设置回调函数失败!");
                } else {
                    log.info("设置回调函数成功! " + lUserID);
                }
            }
            //报警布防参数设置
            HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
            m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
            m_strAlarmInfo.byLevel = 1;  //布防等级
            m_strAlarmInfo.byAlarmInfoType = 1;   // 智能交通报警信息上传类型：0- 老报警信息（NET_DVR_PLATE_RESULT），1- 新报警信息(NET_ITS_PLATE_RESULT)
            m_strAlarmInfo.byDeployType = 1;   //布防类型 1：客户端布防 2：实时布防
            m_strAlarmInfo.write();
            lAlarmHandle = FaceMain.hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo);
            log.info("lAlarmHandle: " + lAlarmHandle + " lUserID " + lUserID);
            if (lAlarmHandle == -1) {
                log.info("布防失败，错误码为" + FaceMain.hCNetSDK.NET_DVR_GetLastError());
            } else {
                map.put(lUserID, lAlarmHandle);
                log.info("布防成功");
            }
            // log.info("2. 是否需要布防 lAlarmHandle" + " " + lUserID + " " + map.get(lUserID));
        }
    }
    /**
     * 报警监听
     * <p>
     * 注意: 设置监听前需要现在本机pc配置端口
     * 具体步骤：库文件ClientDemo->登录设备->配置->网络参数配置->配置告警管理主机地址、告警管理主机端口（需要与NET_DVR_StartListen_V30接口中对应）
     */
    public void StartListen() {
        if (fMSFCallBack_V31 == null) {
            fMSFCallBack_V31 = new FMSGCallBack_V31();
        }
        //这里NET_DVR_StartListen_V30接口中的ip和端口需要和配置的ip和端口对应
        lListenHandle = FaceMain.hCNetSDK.NET_DVR_StartListen_V30("10.17.36.14", (short) 7201, fMSFCallBack_V31, null);
        if (lListenHandle == -1) {
            log.info("监听失败" + FaceMain.hCNetSDK.NET_DVR_GetLastError());
        } else {
            log.info("监听成功");
        }
    }
}
